﻿using System;
using System.Net.Sockets;
using System.Runtime.Serialization.Formatters.Binary;

namespace ChaterFuncLib
{
    /// <summary>
    /// Класс сетевого пакета
    /// </summary>
    [Serializable()]
    public class Packet
    {
        private object[] data;
        private PacketType type;

        /// <summary>
        /// Конструктор пакета
        /// </summary>
        /// <param name="packetsize">Размер массива data</param>
        /// <param name="pkttype">Пакет</param>
        public Packet(int packetsize, PacketType pkttype)
        {
            if (packetsize != 0)
                data = new string[packetsize];
            else
                data = null;
            type = pkttype;
        }

        /// <summary>
        /// Задает строку в массиве data
        /// </summary>
        /// <param name="index">Индекс массива data</param>
        /// <param name="datastr">Заданная строка</param>
        /*public void SetData(int index, string datastr)
        {
            data[index] = datastr;
        }*/

        /* Возможное использование операторов с объектом Packet:
         * if (pkt) - если есть данные в пакете
         * if (!pkt) - если нет данных в пакете
         * if (pkt == num) - если длина пакета составляет num
         * if (pkt != num) - если длина пакета не составляет num
         */
        public static bool operator true(Packet pkt)
        {
            if (pkt.data != null)
                return true;
            return false;
        }
        public static bool operator false(Packet pkt)
        {
            if (pkt.data == null)
                return true;
            return false;
        }
        public static bool operator !(Packet pkt)
        {
            if (pkt.data == null)
                return true;
            return false;
        }
        public static bool operator ==(Packet pkt, int len)
        {
            if (pkt.data.Length == len)
                return true;
            return false;
        }
        public static bool operator !=(Packet pkt, int len)
        {
            if (pkt.data.Length != len)
                return true;
            return false;
        }
        public static bool operator ==(Packet pkt, PacketType type)
        {
            if (pkt.type == type)
                return true;
            return false;
        }
        public static bool operator !=(Packet pkt, PacketType type)
        {
            if (pkt.type != type)
                return true;
            return false;
        }
        public override bool Equals(object obj)
        {
            return base.Equals(obj);
        }
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }
        public object this[int index]
        {
            get
            {
                return data[index];
            }
            set
            {
                data[index] = value;
            }
        }
    };

    public static class PacketIO
    {
        /// <summary>
        /// Посылает пакет клиенту
        /// </summary>
        /// <param name="str">Сетевой поток, куда будет послан пакет</param>
        public static void SendPacket(NetworkStream str, Packet pkt)
        {
            Serializer.Serialize(str, pkt);
        }
    }

    /// <summary>
    /// Пакеты
    /// </summary>
    public enum PacketType
    {
        CMSG_CHECK_CONNECTION,
        CMSG_REGISTER,
        CMSG_AUTH,
        CMSG_MESSAGE,

        SMSG_CONNECTION_AVAILABLE,
        SMSG_CONNECTION_CLOSED,
        SMSG_REGISTER_STATUS_INFO,
        SMSG_AUTH_OK,
        SMSG_AUTH_ERROR,
        SMSG_MESSAGE,
        SMSG_DISCONNECT,
        SMSG_CHECK_CONNECTION,
    };
}